package juc.mythread.communication;

import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;

/**
 * @ClassName testPipedWriterRead
 * @PackageName mythread.communication
 * @projectName myThread
 * @Description 
 * @Author games
 * @Date 2025/8/25 下午5:14
 * @Version 1.0
 */
public class testPipedWriterRead {
    /**
     * 管道通信测试类 - 演示使用PipedWriter和PipedReader实现线程间通信
     * 通过管道将主线程的输入转发给另一个线程进行输出
     * <p>
     * 顺序性：数据按顺序流动，先进先出
     * 阻塞性：当没有数据可读时，read()方法会阻塞等待
     * 字节流：System.in默认按字节读取数据
     * <p>
     * 终端缓冲 → System.in → PipedWriter → PipedReader → System.out
     * ↑                     ↓
     * 用户输入              Print线程
     */
    public static void main(String[] args) {
        // 创建管道输出流和输入流
        PipedWriter out = new PipedWriter(); // 管道输出流，用于写入数据
        PipedReader in = new PipedReader();  // 管道输入流，用于读取数据

        // 连接管道的输出端和输入端
        try {
            out.connect(in); // 建立管道连接，使数据可以从out流向in
        } catch (IOException e) {
            throw new RuntimeException("管道连接失败", e); // 连接失败则抛出运行时异常
        }

        // 创建并启动打印线程，负责从管道读取数据并输出到控制台
        Thread printThread = new Thread(new Print(in), "PrintThread"); // 将管道输入流传递给打印任务
        printThread.start(); // 启动打印线程

        // 主线程逻辑：从控制台读取输入并写入管道
        try {
            int receive; // 用于存储从控制台读取的字符
            // 从控制台获取输入流，循环读取直到遇到EOF(-1)
            // 13 (ASCII): 回车符（Carriage Return, \r）
            // 10 (ASCII): 换行符（Line Feed, \n）
            while ((receive = System.in.read()) != -1) {
                System.out.println("----" + receive);
                out.write(receive); // 将读取的字符写入管道输出流
            }
        } catch (IOException e) {
            System.err.println("读取输入流时发生异常: " + e.getMessage()); // 处理读取异常
        } finally {
            // 确保资源正确关闭
            try {
                out.close(); // 关闭管道输出流
            } catch (IOException e) {
                System.err.println("关闭PipedWriter时发生异常: " + e.getMessage());
            }

            try {
                in.close(); // 关闭管道输入流
            } catch (IOException e) {
                System.err.println("关闭PipedReader时发生异常: " + e.getMessage());
            }

            try {
                printThread.join(); // 等待打印线程结束，确保所有数据都被处理完
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt(); // 恢复中断状态
                System.err.println("主线程等待PrintThread结束时被中断");
            }
        }
    }

    static class Print implements Runnable {
        private PipedReader in;

        public Print(PipedReader in) {
            this.in = in;
        }

        @Override
        public void run() {
            try {
                int receive;
                while ((receive = in.read()) != -1) {
                    System.out.print((char) receive);
                }
            } catch (IOException ex) {
                System.err.println("Print线程读取时发生异常: " + ex.getMessage());
            }
        }
    }

}
